package com.seafwg;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @Author seafwg
 * @Date 2022/7/28 10:25
 * @Version 1.0
 * @Description 创建线程方式三：实现Callable接口。jdk 5.0
 * 创建流程：调用流出和实现Runnable接口相似
 *  1.创建实现Callable接口的类。
 *  2.实现call方法
 *  3.调用时创建实现子类对象，作为参数传递给FutureTask构造器创建futureTask对象
 *  4.将futureTask作为参数传递给Thread构造器，创建Thread对象并且调用start方法启动线程
 *  5.可以通过futureTask对象获取call方法地返回值信息 ---- 可选
 * 实现Callable接口的优点：实现的call()方法具有以下特性
 *  1.可以有返回值
 *  2.可以抛出异常，方便外边的捕获操作，获取异常信息
 *  3.Callable支持范型
 */

public class ImplCallableTest {
    public static void main(String[] args) {
        NumThread thread = new NumThread();
        FutureTask futureTask = new FutureTask(thread);
        Thread t = new Thread(futureTask);
        t.start();

        try {
            int res = (int) futureTask.get();
            System.out.println("sum:" + res);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 使用实现Callable接口创建线程
 */
class NumThread implements Callable{
    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 101; i++) {
            if (i % 2 == 0) {
                System.out.println(i);
                sum += i;
            }
        }
        return sum;
    }
}